﻿using JinYuan.CommunicationLib.Enum;
using JinYuan.Helper;
using JinYuan.Models;
using JinYuan.VirtualDataLibrary;
using PLCCommunication;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;

namespace LargeSquareOne
{
    public partial class FrmRecipe : Form
    {
        public FrmRecipe()
        {
            InitializeComponent();

            ////设置控件样式，去除缓冲
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.SetStyle(ControlStyles.Selectable, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        }

        /// <summary>
        /// PLC内批量写\0
        /// </summary>
        /// <param name="Num"></param>
        /// <returns></returns>
        public string GetString_0(int Num)
        {
            string ff = "";
            for (int i = 0; i < Num; i++)
            {
                ff = ff.Insert(ff.Length, "\0");
            }
            return ff;
        }


        #region 减少闪烁
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams parss = base.CreateParams;
                parss.ExStyle |= 0x02000000;
                return parss;
            }
        }
        #endregion

        Dictionary<string, object> disOldValue = new System.Collections.Generic.Dictionary<string, object>();

        /// <summary>
        /// 定义DataGridView数据源
        /// </summary>
        private BindingList<ParamList> blPLCConfigBaseList = new BindingList<ParamList>();

        private void FrmRecipe_Load(object sender, EventArgs e)
        {
            this.dgvPara.AutoGenerateColumns = false;
            this.dgvPara.DataSource = blPLCConfigBaseList;
            GetProdModel();
            GetChallengeCode();
            GetProductParam(0);
        }



        private void GetProdModel()
        {
            try
            {
                var productList = CommonMethods.db.QuerySqlList<ProductModel>(CommonMethods.dBSQL.GetProdTypeSql());
                dgvProdModel.DataSource = productList;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //获取挑战件条码
        private void GetChallengeCode()
        {
            try
            {
                var ChallengeCodeList = CommonMethods.db.QuerySqlList<Challenge>(CommonMethods.dBSQL.GetChallengeCode());
                dgvPara.DataSource = ChallengeCodeList;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        #region 选择产品型号
        /// <summary>
        /// 点击单元格
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvProdModel_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            int row = dgvProdModel.CurrentCell.RowIndex;
            GetProductParam(row);
        }


        public void GetProductParam(int row)
        {
            try
            {
                if (dgvProdModel.Rows.Count > 0)
                {
                    string strModelType = dgvProdModel.Rows[row].Cells["ModelName"].Value.ToString();
                    lb_Model.Text = strModelType;
                    var list = CommonMethods.db.QuerySqlList<ParamList>(CommonMethods.dBSQL.GetProductParaByProdModel(strModelType));
                    disOldValue.Clear();
                    for (int i = 0; i < list.Count; i++)
                    {
                        if (!disOldValue.ContainsKey(list[i].Remark))
                        {
                            disOldValue.Add(list[i].Remark, $"{list[i].ParaValueMin},{list[i].ParaValueMax}");
                        }
                    }
                    //dgvPara.DataSource = list;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("加载数据失败" + ex.Message);
            }
        }

        #endregion

        /// <summary>
        /// 点击极限件单元格
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void dgvPara_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            int row = dgvPara.CurrentCell.RowIndex;
            try
            {
                if (dgvPara.Rows.Count > 0)
                {
                    string strModelType = dgvPara.Rows[row].Cells[0].Value.ToString();
                    string strModelType2 = dgvPara.Rows[row].Cells[1].Value.ToString();
                    string strModelType3 = dgvPara.Rows[row].Cells[2].Value.ToString();
                    ChallengeCodeText.Text = strModelType;
                    comboBox1.Text = strModelType2;
                    comboBox2.Text = strModelType3;
                    var list = CommonMethods.db.QuerySqlList<Challenge>(CommonMethods.dBSQL.GetChallengeCode(strModelType));
                    //disOldValue.Clear();
                    //for (int i = 0; i < list.Count; i++)
                    //{
                    //    if (!disOldValue.ContainsKey(list[i].Remark))
                    //    {
                    //        disOldValue.Add(list[i].Remark, $"{list[i].ParaValueMin},{list[i].ParaValueMax}");
                    //    }
                    //}
                    //dgvPara.DataSource = list;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("加载数据失败" + ex.Message);
            }
        }

        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Add_Click(object sender, EventArgs e)
        {
            var productModel = new ProductModel();
            productModel.ModelName = txtProductModel.Text;
            productModel.MaterialCode = txtMaterialCode.Text;
            productModel.Remark = txtProductModel.Text;
            if (string.IsNullOrEmpty(productModel.ModelName))
            {
                new FrmMsgBoxOutWithAck(2, "产品型号不能为空！", "添加型号").Show();
                return;
            }
            if (string.IsNullOrEmpty(productModel.MaterialCode))
            {
                new FrmMsgBoxOutWithAck(2, "型号对应的物料编码不能为空！", "添加型号").Show();
                return;
            }
            try
            {
                bool b = CommonMethods.db.AddReturnBool<ProductModel>(productModel);
                if (b)
                {
                    GetProdModel();
                    CommonMethods.ChangeParamData();
                    new FrmMsgBoxOutWithAck(1, "添加成功！", "添加型号").Show();
                }
                else
                {
                    new FrmMsgBoxOutWithAck(3, "添加失败！", "添加型号").Show();
                }
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("重复键"))
                {
                    LoggerHelp.WriteEX(ex);
                    new FrmMsgBoxOutWithAck(3, "添加失败:已存在改型号，重复新增！", "添加型号").Show();
                }
                else
                {
                    LoggerHelp.WriteEX(ex);
                    new FrmMsgBoxOutWithAck(3, $"添加失败:{ex.Message}", "添加型号").Show();
                }
            }

            //同步刷新主界面的类型选项
            //sendParamIN();
        }

        private void btn_Save_Click(object sender, EventArgs e)
        {
            if (dgvProdModel.Rows.Count > 0 && dgvProdModel.CurrentCell.RowIndex > -1)
            {
                int row = dgvProdModel.CurrentCell.RowIndex;
                string strModelType = dgvProdModel.Rows[row].Cells["ModelName"].Value.ToString();
                if (string.IsNullOrEmpty(strModelType) || dgvPara.Rows.Count <= 0)
                {

                    new FrmMsgBoxOutWithAck(2, "产品型号和参数列表不能为空！", "保存参数").Show();
                    return;
                }
                try
                {
                    List<ParamList> list = (List<ParamList>)dgvPara.DataSource;

                    int f = CommonMethods.db.Delete<ParamList>(t => t.ModelName == strModelType);
                    if (f >= 0)
                    {
                        bool b = CommonMethods.db.AddReturnBool<ParamList>(list);
                        if (b)
                        {
                            GetProdModel();
                            CommonMethods.ChangeParamData();
                            new FrmMsgBoxOutWithAck(1, "保存成功！", "保存参数").Show();
                        }
                        else
                        {
                            new FrmMsgBoxOutWithAck(3, "保存失败！", "保存参数").Show();
                        }
                    }
                }
                catch (Exception ex)
                {

                    new FrmMsgBoxOutWithAck(3, "保存失败", "保存参数").Show();

                }
            }
            else
            {
                new FrmMsgBoxOutWithAck(1, "请选择产品型号", "保存参数").Show();
            }
        }


        private void btnDelProductModel_Click(object sender, EventArgs e)
        {
            if (dgvProdModel.Rows.Count > 0 && dgvProdModel.CurrentCell.RowIndex > -1)
            {
                int row = dgvProdModel.CurrentCell.RowIndex;
                string strModelType = dgvProdModel.Rows[row].Cells["ModelName"].Value.ToString();
                if (string.IsNullOrEmpty(strModelType))
                {

                    new FrmMsgBoxOutWithAck(2, "选择要删除的生产型号", "删除型号").Show();
                    return;
                }
                DialogResult dialogResult = new FrmMsgBoxWithAck($"是否要删除型号【{strModelType}】", "删除型号").ShowDialog();
                if (dialogResult == DialogResult.OK)
                {
                    try
                    {
                        int f = CommonMethods.db.Delete<ProductModel>(t => t.ModelName == strModelType);
                        if (f > 0)
                        {
                            GetProdModel();
                            CommonMethods.ChangeParamData();
                        }

                        new FrmMsgBoxOutWithAck(1, "删除成功！", "删除型号").Show();

                    }
                    catch (Exception ex)
                    {
                        new FrmMsgBoxOutWithAck(1, $"删除失败:{ex.Message}", "删除型号").Show();

                    }
                }
            }
        }

        private void dgvProdModel_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            //显示序列号
            DataGridViewHelper.DgvRowPostPaint(this.dgvProdModel, e);
        }

        private void dgvPara_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            //显示序列号
            DataGridViewHelper.DgvRowPostPaint(this.dgvPara, e);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string Code1 = CodeText1.Text;
            string Code2 = CodeText2.Text;
            string Code3 = CodeText3.Text;
            string Code4 = CodeText4.Text;
            //根据PLC给的地址长度给二维码补0
            string ZeroCode1 = Code1 + GetString_0(40 - Code1.Length);
            string ZeroCode2 = Code2 + GetString_0(40 - Code2.Length);
            string ZeroCode3 = Code3 + GetString_0(40 - Code3.Length);
            string ZeroCode4 = Code4 + GetString_0(40 - Code4.Length);
            //byte[] Codebytes = Encoding.Default.GetBytes(ZeroCode).ByteReverse();
            byte[] Codebytes1 = Encoding.Default.GetBytes(ZeroCode1);
            byte[] Codebytes2 = Encoding.Default.GetBytes(ZeroCode2);
            byte[] Codebytes3 = Encoding.Default.GetBytes(ZeroCode3);
            byte[] Codebytes4 = Encoding.Default.GetBytes(ZeroCode4);

            //条码地址
            int dress1 = 2500;
            int dress2 = 2520;
            int dress3 = 2540;
            int dress4 = 2560;
            string TouchDress = "D2490";//触发地址
            string StrDress1 = "D" + dress1.ToString();
            string StrDress2 = "D" + dress2.ToString();
            string StrDress3 = "D" + dress3.ToString();
            string StrDress4 = "D" + dress4.ToString();

            if (string.IsNullOrEmpty(Code1) || string.IsNullOrEmpty(Code2) || string.IsNullOrEmpty(Code3) || string.IsNullOrEmpty(Code4))
            {
                new FrmMsgBoxOutWithAck(2, "上传条码不能为空！", "条码上传").Show();
                return;
            }

            JYResult result1 = CommonMethods.PlcLink.WriteValue(StrDress1, Codebytes1, Data_Type.ArrByte);
            JYResult result2 = CommonMethods.PlcLink.WriteValue(StrDress2, Codebytes2, Data_Type.ArrByte);
            JYResult result3 = CommonMethods.PlcLink.WriteValue(StrDress3, Codebytes3, Data_Type.ArrByte);
            JYResult result4 = CommonMethods.PlcLink.WriteValue(StrDress4, Codebytes4, Data_Type.ArrByte);

            System.Threading.Thread.Sleep(500);
            CommonMethods.PlcLink.WriteValue(TouchDress, 1, Data_Type.Short);//给PLC触发

            new FrmMsgBoxOutWithAck(2, "上传成功！", "条码上传").Show();
        }

        private void ChallengeButton_Click(object sender, EventArgs e)
        {
            var ChallengeCode = new Challenge();
            ChallengeCode.ChallengeBarCode = ChallengeCodeText.Text;
            ChallengeCode.CodeMessage = comboBox1.Text;
            ChallengeCode.WeldingCCD = comboBox2.Text;
            if (string.IsNullOrEmpty(ChallengeCode.ChallengeBarCode))
            {
                new FrmMsgBoxOutWithAck(2, "挑战件条码不能为空！", "添加挑战件条码").Show();
                return;
            }
            try
            {
                bool b = CommonMethods.db.AddReturnBool<Challenge>(ChallengeCode);
                if (b)
                {
                    GetChallengeCode();
                    new FrmMsgBoxOutWithAck(1, "添加成功！", "添加挑战件条码").Show();
                }
                else
                {
                    new FrmMsgBoxOutWithAck(3, "添加失败！", "添加挑战件条码").Show();
                }
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("重复键"))
                {
                    LoggerHelp.WriteEX(ex);
                    new FrmMsgBoxOutWithAck(3, "添加失败:已存在该挑战件条码，重复新增！", "添加添加挑战件条码").Show();
                }
                else
                {
                    LoggerHelp.WriteEX(ex);
                    new FrmMsgBoxOutWithAck(3, $"添加失败:{ex.Message}", "添加添加挑战件条码").Show();
                }
            }
        }
    }
}
